package cn.shengchao.dubbo.bi;

import cn.hutool.core.bean.BeanUtil;
import cn.shengchao.examstar.distribute.infrastrure.po.DistributeNodeInfo;
import cn.shengchao.examstar.distribute.infrastrure.po.DistributeUserInvite;
import cn.shengchao.examstar.distribute.infrastrure.service.DistributeUserInviteService;
import cn.shengchao.examstar.distribute.model.DistributeNodeRoleChainExistModel;
import cn.shengchao.examstar.distribute.ohs.local.appservice.DistributeNodeRoleChainExistLoader;
import cn.shengchao.examstar.rpc.distribute.cs.UserCs;
import cn.shengchao.examstar.rpc.distribute.dto.UserInviteDto;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeDataStatusEnum;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeSaleRoleEnum;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeTypeEnum;
import cn.shengchao.qywx.infrastrure.po.QywxUserServiceInvite;
import cn.shengchao.qywx.infrastrure.service.QywxUserServiceInviteService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;


/**
 * @program: examstarapi
 * @description: 邀请关系统一处理业务类
 * *目前平台邀请关系需要建立推广分销节点关系以及企微服务的邀请关系
 *
 * *推广分销: 目标是学员，所有用户都有共同的身份是学员。
 * **推广分销关系：分销关系决定了被邀请学员的消费分成:
 * ***推广分销节点有平台，市场经理，加盟商，加盟商员工和会员
 * ***平台下可以挂市场经理，加盟商，会员
 * ***市场经理是平台下的管理者，不存在邀请关系，直接管理加盟商。
 * ***加盟商是市场推广的机构，下面可以挂员工，会员
 * ***加盟商员工是不能独立存在的，必须挂加盟商。
 * ***会员是灵活的，可以挂加盟商，也可以是挂平台。
 *
 * *企微服务：企微服务邀请关系决定了被邀请学员的企微服务关系
 * ** 企微服务邀请关系是邀请人对学员的咨询服务关系，根据现有业务，企微服务的最终执行人只有加盟商机构和平台会员。
 * ** 企微服务主要考虑的机构邀请的学员的咨询服务，在目前看来机构可以具备专业咨询的能力
 *
 * *** 加盟商机构: 一般是培训机构，可以有专业咨询的能力。
 * *** 平台会员，是自身发展的个体，专业咨询能力可能欠缺。
 * **** 平台会员怎么纳入企微是一个问题。平台得联系平台会员纳入企微，提供服务平台。
 * **** 平台会员的咨询能力也是一个问题，以后需要考虑平台针对这部分会员进行咨询服务的培训。
 *
 * * 按产品设计来说：
 * ** 学员主要来自学员本身注册和邀请。学员的消费平台需要处理推广分销佣金和内容提供者的分成。
 * *** 邀请业务的关系是推广分销关系,。
 * *** 自己注册的学员，属于平台的，不用处理推广分销，消费只处理内容分成。
 * @author: Xiong weiqiang
 * @create: 2025-05-02 10:16
 */
@Component
@RequiredArgsConstructor
public class InviteUnifiedCreateProcessor {
    //推广分销的邀请关系
    private final DistributeUserInviteService userInviteService;
    //企微服务的邀请关系
    private final QywxUserServiceInviteService qywxUserServiceInviteService;
    private final DistributeNodeRoleChainExistLoader distributeNodeRoleChainExistLoader;
    @Transactional
    public void savePlatformUserInviteRecord(UserInviteDto userInviteDto) {
        //主要要记录分销商。
        Long distributeUserId=0L;
        String distributeCode=DistributeSaleRoleEnum.ROLE_YSXG.getCode();
        if (!UserCs.PLATFORM_USER_ID.equals(userInviteDto.getUserId())){
            DistributeNodeRoleChainExistModel existModel =distributeNodeRoleChainExistLoader.loadModelByUserId(userInviteDto.getUserId(), DistributeTypeEnum.TYPE_SALE.getType());
            if (existModel.isExist()){
                DistributeNodeInfo distributeNodeInfo=existModel.getDistributeNodeInfo();
                if (distributeNodeInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_DSPD_EMP.getCode())){
                    //记录主体用户（员工做邀请者，不能做主体）
                    distributeUserId=distributeNodeInfo.getAdminUserId();
                }else if (distributeNodeInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_SLMB.getCode())){
                    if (existModel.getUpLevelNodeInfo()!=null&&existModel.getUpLevelNodeInfo().getDistributeRoleCode()!=null&& DistributeSaleRoleEnum.ROLE_DSPD.getCode().equals(existModel.getUpLevelNodeInfo().getDistributeRoleCode())){
                        //上级是加盟商
                        distributeUserId=existModel.getUpLevelNodeInfo().getUserId();
                    }else {
                        //除了上级是加盟商，其他情况主体用户都是自己，上级是平台
                        distributeUserId=distributeNodeInfo.getUserId();
                    }
                }
            }
        }
        QywxUserServiceInvite qywxUserServiceInvite=new QywxUserServiceInvite();
        qywxUserServiceInvite.setUserId(userInviteDto.getUserId());
        qywxUserServiceInvite.setServiceUserId(userInviteDto.getInviteUserId());
        qywxUserServiceInvite.setServiceDistributeUserId(distributeUserId);
        qywxUserServiceInvite.setServiceDistributeCode(distributeCode);
        //现有关系改为失效，备查，新增一般是没有的
        qywxUserServiceInviteService.update(Wrappers.lambdaUpdate(QywxUserServiceInvite.class)
                .eq(QywxUserServiceInvite::getUserId,userInviteDto.getUserId())
                .eq(QywxUserServiceInvite::getDataStatus,0)
                .set(QywxUserServiceInvite::getDataStatus,1)
        );
        //保存新记录
        qywxUserServiceInviteService.save(qywxUserServiceInvite);
        //现有关系改为失效，备查，新增一般是没有的
        userInviteService.update(Wrappers.lambdaUpdate(DistributeUserInvite.class)
                .eq(DistributeUserInvite::getUserId, userInviteDto.getUserId())
                .set(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_HIS.getStatus())
        );
        DistributeUserInvite distributeUserInvite = new DistributeUserInvite();
        BeanUtil.copyProperties(userInviteDto, distributeUserInvite);
        distributeUserInvite.setDataStatus(DistributeDataStatusEnum.STATUS_CURT.getStatus());
        userInviteService.save(distributeUserInvite);
    }


    public InviteUnifiedCheckDto getInviteUnifiedCheckDto(Long userId) {
        //分销邀请关系
        DistributeUserInvite distributeUserInvite = userInviteService.getOne(Wrappers.lambdaQuery(DistributeUserInvite.class)
                .eq(DistributeUserInvite::getUserId, userId)
                .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus())
        );
        //企微服务邀请关系
        QywxUserServiceInvite qywxUserServiceInvite=qywxUserServiceInviteService.getOne(Wrappers.lambdaQuery(QywxUserServiceInvite.class)
                .eq(QywxUserServiceInvite::getUserId,  userId)
                .eq(QywxUserServiceInvite::getDataStatus,0)
        );
        if (distributeUserInvite==null){
            distributeUserInvite= DistributeUserInvite.buildPlatformInviteRecord(userId);
        }
        if (qywxUserServiceInvite==null){
            qywxUserServiceInvite=new QywxUserServiceInvite();
            qywxUserServiceInvite.setServiceUserId(UserCs.PLATFORM_USER_ID);
            qywxUserServiceInvite.setServiceDistributeUserId(UserCs.PLATFORM_USER_ID);
        }
        InviteUnifiedCheckDto inviteUnifiedCheckDto=new InviteUnifiedCheckDto();
        inviteUnifiedCheckDto.setUserId(userId);
        inviteUnifiedCheckDto.setInviteUserId(distributeUserInvite.getInviteUserId());
        inviteUnifiedCheckDto.setServiceUserId(qywxUserServiceInvite.getServiceUserId());
        inviteUnifiedCheckDto.setServiceCpUserId(qywxUserServiceInvite.getServiceCpUserId());
        inviteUnifiedCheckDto.setServiceUserDistributeCode(qywxUserServiceInvite.getServiceDistributeCode());
        inviteUnifiedCheckDto.setServiceDistributeUserId(qywxUserServiceInvite.getServiceDistributeUserId());
        inviteUnifiedCheckDto.setSaleDistributeUserId(distributeUserInvite.getInviteUserId());
        if (UserCs.PLATFORM_USER_ID.equals(distributeUserInvite.getInviteUserId())){
            //这里是平台。
            inviteUnifiedCheckDto.setFinalUserDistributeCode(DistributeSaleRoleEnum.ROLE_YSXG.getCode());
        }else{
            DistributeNodeInfo distributeNodeInfo=distributeNodeRoleChainExistLoader.loadModelByUserId(distributeUserInvite.getDistributeUserId(), DistributeTypeEnum.TYPE_SALE.getType()).getDistributeNodeInfo();
            //这里只有两种，要么是加盟商，要么是平台会员。
            inviteUnifiedCheckDto.setFinalUserDistributeCode(distributeNodeInfo.getDistributeRoleCode());
        }
        inviteUnifiedCheckDto.setFinalDistributeUserId(distributeUserInvite.getDistributeUserId());
        return inviteUnifiedCheckDto;
    }

    /**
     * 加盟商体系的客服邀请关系，继承邀请源头的客服
     * @param slmbUserId
     * @param slmbInviteUnifiedCheckDto
     */
    @Transactional
    public void processSlmbServiceInviteExtend(Long slmbUserId,InviteUnifiedCheckDto slmbInviteUnifiedCheckDto) {
        QywxUserServiceInvite qywxUserServiceInvite=new QywxUserServiceInvite();
        qywxUserServiceInvite.setUserId(slmbUserId);
        qywxUserServiceInvite.setServiceUserId(slmbInviteUnifiedCheckDto.getServiceUserId());
        qywxUserServiceInvite.setServiceCpUserId(slmbInviteUnifiedCheckDto.getServiceCpUserId());
        qywxUserServiceInvite.setServiceDistributeUserId(slmbInviteUnifiedCheckDto.getServiceDistributeUserId());
        qywxUserServiceInvite.setServiceDistributeCode(slmbInviteUnifiedCheckDto.getServiceUserDistributeCode());
        //现有关系改为失效，备查，新增一般是没有的
        qywxUserServiceInviteService.update(Wrappers.lambdaUpdate(QywxUserServiceInvite.class)
                .eq(QywxUserServiceInvite::getUserId,slmbUserId)
                .eq(QywxUserServiceInvite::getDataStatus,0)
                .set(QywxUserServiceInvite::getDataStatus,1)
        );
        //保存新记录
        qywxUserServiceInviteService.save(qywxUserServiceInvite);
    }
}